রুবি প্রোগ্রামিং ভাষায় exception handling (ত্রুটি ব্যবস্থাপনা) পরিচালনা করার জন্য begin, rescue, এবং ensure ব্লক ব্যবহার করা হয়। এগুলি কোডের মধ্যে ত্রুটি (error) ঘটলে সেই ত্রুটির মোকাবেলা করতে এবং পরবর্তী কোড নিরাপদভাবে চালানোর জন্য ব্যবহৃত হয়। রুবিতে এই তিনটি ব্লক একসাথে ব্যবহার করে আপনি কোডের স্থিতিশীলতা এবং নিরাপত্তা নিশ্চিত করতে পারেন।
১. begin ব্লক
begin ব্লক দিয়ে আপনি কোডের একটি সেগমেন্ট চিহ্নিত করেন, যেখানে ত্রুটি ঘটতে পারে। এই ব্লকের মধ্যে কোড লেখা হয় যেটি আপনি চালাতে চান এবং যার মধ্যে ত্রুটি ঘটলে সেই ত্রুটির জন্য rescue ব্লক ট্রিগার হবে।
begin
# কোড যা ত্রুটি ঘটাতে পারে
num = 10 / 0
rescue ZeroDivisionError => e
puts "Error: #{e.message}"
endএখানে, begin ব্লকের মধ্যে num = 10 / 0 কোডটি একটি ZeroDivisionError ত্রুটি তৈরি করবে। এই ত্রুটি rescue ব্লক দ্বারা ধরা হবে এবং ত্রুটির বার্তা প্রদর্শিত হবে।
২. rescue ব্লক
rescue ব্লক ব্যবহৃত হয় ত্রুটির ধরন (exception type) চিহ্নিত করার জন্য এবং সেই ত্রুটির জন্য ব্যবস্থা নেওয়ার জন্য। যখন begin ব্লকের মধ্যে কোনো ত্রুটি ঘটে, তখন রুবি স্বয়ংক্রিয়ভাবে rescue ব্লকটি এক্সিকিউট করবে।
২.১ Basic Rescue
begin
# কোড যা ত্রুটি ঘটাতে পারে
file = File.open("nonexistent_file.txt")
rescue StandardError => e
puts "Caught an error: #{e.message}"
endএখানে, যদি "nonexistent_file.txt" ফাইলটি না থাকে, তাহলে একটি StandardError ত্রুটি হবে এবং rescue ব্লকটি এক্সিকিউট হবে, যা ত্রুটির বার্তা মুদ্রণ করবে।
২.২ Multiple Rescue Blocks
একাধিক ধরনের ত্রুটি ধরতে আপনি একাধিক rescue ব্লক ব্যবহার করতে পারেন।
begin
# কোড যা বিভিন্ন ত্রুটি ঘটাতে পারে
num = 10 / 0
file = File.open("nonexistent_file.txt")
rescue ZeroDivisionError => e
puts "Cannot divide by zero: #{e.message}"
rescue Errno::ENOENT => e
puts "File not found: #{e.message}"
endএখানে, ZeroDivisionError এবং Errno::ENOENT ত্রুটিগুলি পৃথকভাবে ধরা হচ্ছে এবং তাদের জন্য আলাদা বার্তা মুদ্রিত হচ্ছে।
৩. ensure ব্লক
ensure ব্লকটি একটি বিকল্প ব্লক যা সবসময় এক্সিকিউট হয়, ত্রুটি ঘটুক বা না ঘটুক। এটি সাধারণত ত্রুটি হ্যান্ডলিংয়ের পর পরবর্তী কাজের জন্য ব্যবহৃত হয়, যেমন রিসোর্স ক্লোজ করা বা পরিষ্কার করা (e.g., ফাইল বন্ধ করা, ডাটাবেস সংযোগ বন্ধ করা)।
begin
# কোড যা ত্রুটি ঘটাতে পারে
file = File.open("example.txt", "r")
content = file.read
puts content
rescue StandardError => e
puts "Caught an error: #{e.message}"
ensure
puts "This will always execute"
file.close if file # ফাইলটি যদি খোলা থাকে, তবে বন্ধ হবে
endএখানে, ensure ব্লকটি ত্রুটি ঘটুক বা না ঘটুক, সর্বদা এক্সিকিউট হবে। এটি ফাইল বা অন্য রিসোর্সের ক্লোজিং কাজ সম্পন্ন করবে।
৪. retry স্টেটমেন্ট
retry স্টেটমেন্টটি ত্রুটি ঘটলে কোডের শুরু থেকে পুনরায় চেষ্টা করতে ব্যবহৃত হয়। এটি সাধারণত একটি লুপের মধ্যে ব্যবহার করা হয়।
begin
# কোড যা ত্রুটি ঘটাতে পারে
num = 10 / 0
rescue ZeroDivisionError => e
puts "Error: #{e.message}, retrying..."
retry # আবার শুরু থেকে চেষ্টা করবে
endএখানে, ZeroDivisionError ত্রুটি ঘটলে, retry স্টেটমেন্টের মাধ্যমে পুনরায় begin ব্লকটি এক্সিকিউট করা হবে।
সারসংক্ষেপ
begin: কোডের অংশ যেখানে ত্রুটি ঘটতে পারে। এটি ত্রুটি হ্যান্ডলিং শুরু করে।rescue: ত্রুটি ঘটলে, সেই ত্রুটির জন্য ব্যবস্থাপনা করা হয়। এটি একাধিক ত্রুটি ধরতে ব্যবহৃত হতে পারে।ensure: এটি একটি বিকল্প ব্লক যা ত্রুটি ঘটুক বা না ঘটুক, সর্বদা এক্সিকিউট হয়। এটি কোডের শেষের দিকে রিসোর্স পরিষ্কার করার জন্য ব্যবহৃত হয়।retry: ত্রুটি ঘটলে কোড পুনরায় চালাতে ব্যবহৃত হয়।
রুবিতে এই তিনটি ব্লক ত্রুটি হ্যান্ডলিংয়ের জন্য একটি শক্তিশালী ও পরিষ্কার ব্যবস্থা সরবরাহ করে, যা আপনার কোডের স্থিতিশীলতা নিশ্চিত করে এবং ত্রুটি মোকাবেলায় সহায়ক।
Read more